# -*- coding: utf-8 -*-
#
# File: TermoReferencia.py
#
# Copyright (c) 2006 by IBICT
# Generator: ArchGenXML Version 1.5.0
#            http://plone.org/products/archgenxml
#
# GNU General Public License (GPL)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#

__author__ = """IBICT <cadu@ibict.br>"""
__docformat__ = 'plaintext'

from AccessControl import ClassSecurityInfo
from Products.Archetypes.atapi import *
from Products.Archetypes.SQLStorage import *
from Products.SIGFS.config import *

# additional imports from tagged value 'import'
from Products.DataGridField.DataGridField import DataGridField
from Products.DataGridField.DataGridWidget import DataGridWidget

##code-section module-header #fill in your manual code here
from Acquisition import aq_parent, aq_inner
from Products.Archetypes import transaction
from Products.CMFCore.utils import getToolByName
##/code-section module-header

schema = Schema((

    StringField(
        name='instrumento',
        serchable="1",
        enforceVocabulary=1,
        widget=SelectionWidget(
            label="Instrumento",
            description="Selecione o instrumento deste Termo de Referência.",
            format="select",
            label_msgid='SIGFS_label_instrumento',
            description_msgid='SIGFS_help_instrumento',
            i18n_domain='SIGFS',
        ),
        vocabulary='getInstrumentos'
    ),

    DateTimeField(
        name='prazo_pendencia_termo',
        default="DateTime()",
        serchable="1",
        required=1,
        widget=CalendarWidget(
            label="Prazo de pendência",
            description="Informe a data durante a qual os revisores poderão inserir comentários sobre o Termo de Referência, antes de publicá-lo. Ela deve ser menor que a data de execução do projeto.",
            format="%d/%m/%Y",
            date_only="1",
            show_hm=False,
            label_msgid='SIGFS_label_prazo_pendencia_termo',
            description_msgid='SIGFS_help_prazo_pendencia_termo',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='titulo_projeto',
        serchable="1",
        widget=StringWidget(
            label="Título do Projeto",
            description="Informe o título do projeto deste Termo de Referência.",
            label_msgid='SIGFS_label_titulo_projeto',
            description_msgid='SIGFS_help_titulo_projeto',
            i18n_domain='SIGFS',
        )
    ),

    DateTimeField(
        name='prazo_execucao_projeto',
        default="DateTime()",
        serchable="1",
        widget=CalendarWidget(
            label="Prazo de execução do projeto",
            description="Informe a data final do prazo para execução do projeto.",
            format="%d/%m/%Y",
            date_only="1",
            show_hm=False,
            label_msgid='SIGFS_label_prazo_execucao_projeto',
            description_msgid='SIGFS_help_prazo_execucao_projeto',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='agencia_executora',
        serchable="1",
        enforceVocabulary=1,
        widget=SelectionWidget(
            label="Agência executora",
            description="Selecione a agência executora deste projeto.",
            format="select",
            label_msgid='SIGFS_label_agencia_executora',
            description_msgid='SIGFS_help_agencia_executora',
            i18n_domain='SIGFS',
        ),
        vocabulary='getAgencias'
    ),

    TextField(
        name='objetivos',
        serchable="1",
        widget=TextAreaWidget(
            label="Objetivos",
            description="Informe os objetivos do Termo de Referência.",
            label_msgid='SIGFS_label_objetivos',
            description_msgid='SIGFS_help_objetivos',
            i18n_domain='SIGFS',
        )
    ),

    TextField(
        name='justificativa',
        serchable="1",
        widget=TextAreaWidget(
            label="Justificativa",
            description="Informe a justificativa para o Termo de Referência.",
            label_msgid='SIGFS_label_justificativa',
            description_msgid='SIGFS_help_justificativa',
            i18n_domain='SIGFS',
        )
    ),

    TextField(
        name='publico_alvo',
        serchable="1",
        widget=TextAreaWidget(
            label="Público alvo",
            description="Informe o público alvo do Termo de Referência.",
            label_msgid='SIGFS_label_publico_alvo',
            description_msgid='SIGFS_help_publico_alvo',
            i18n_domain='SIGFS',
        )
    ),

    TextField(
        name='descricao_termo',
        serchable="1",
        widget=TextAreaWidget(
            label="Descrição",
            description="Informe uma descrição para o Termo de Referência.",
            label_msgid='SIGFS_label_descricao_termo',
            description_msgid='SIGFS_help_descricao_termo',
            i18n_domain='SIGFS',
        )
    ),

    TextField(
        name='resultado_esperado',
        allowable_content_types=('text/plain', 'text/structured', 'text/html', 'application/msword',),
        serchable="1",
        default_output_type='text/html',
        widget=RichWidget(
            label="Resultado esperado",
            description="Informe o(s) resultado(s) esperado(s) sobre o Termo de Referência.",
            label_msgid='SIGFS_label_resultado_esperado',
            description_msgid='SIGFS_help_resultado_esperado',
            i18n_domain='SIGFS',
        )
    ),

    ImageField(
        name='assinatura_presidente',
        allowable_content_types=("image/*",),
        serchable="1",
        storage=AttributeStorage(),
        widget=ImageWidget(
            label="Assinatura digital do presidente do Comitê Gestor ou do presidente do Comitê de Coordenação",
            description="Faça upload da assinatura digital do presidentedo Comitê Gestor ou do presidente do Comitê de Coordenação. Sem ela o Termo não poderá ser publicado ou enviado.",
            label_msgid='SIGFS_label_assinatura_presidente',
            description_msgid='SIGFS_help_assinatura_presidente',
            i18n_domain='SIGFS',
        )
    ),

    ImageField(
        name='assinatura_coordenacao',
        allowable_content_types=("image/*",),
        serchable="1",
        storage=AttributeStorage(),
        widget=ImageWidget(
            label="Assinatura da Coordenação da Secretaria Técnica",
            description="Faça o upload da assinatura digital da coordenação da Secretaria Técnica.",
            label_msgid='SIGFS_label_assinatura_coordenacao',
            description_msgid='SIGFS_help_assinatura_coordenacao',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='instituicoes',
        serchable="1",
        widget=MultiSelectionWidget(
            label="Instituição",
            description="Escolha as instituições que serão executoras e participantes.",
            label_msgid='SIGFS_label_instituicoes',
            description_msgid='SIGFS_help_instituicoes',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='contato_instituicao',
        serchable="1",
        widget=StringWidget(
            label="Nome do contato",
            description="Informe o nome da pessoa de contato da instituição.",
            label_msgid='SIGFS_label_contato_instituicao',
            description_msgid='SIGFS_help_contato_instituicao',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='email_contato_instituicao',
        serchable="1",
        widget=StringWidget(
            label="Email da pessoa de contato",
            description="Informe o email da pessoa de contato.",
            label_msgid='SIGFS_label_email_contato_instituicao',
            description_msgid='SIGFS_help_email_contato_instituicao',
            i18n_domain='SIGFS',
        ),
        validators=('isEmail',)
    ),

    StringField(
        name='telefone_contato_instituicao',
        serchable="1",
        widget=StringWidget(
            label="Telefone",
            description="Informe o telefone da pessoa de contato da instituição.",
            label_msgid='SIGFS_label_telefone_contato_instituicao',
            description_msgid='SIGFS_help_telefone_contato_instituicao',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='parceiros',
        serchable="1",
        widget=MultiSelectionWidget(
            label="Parceiros",
            description="Escolha os parceiros que farão parte deste termo de referência.",
            label_msgid='SIGFS_label_parceiros',
            description_msgid='SIGFS_help_parceiros',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='contato_parceiro',
        serchable="1",
        widget=StringWidget(
            label="Nome do contato",
            description="Informe o nome da pessoa de contato.",
            label_msgid='SIGFS_label_contato_parceiro',
            description_msgid='SIGFS_help_contato_parceiro',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='email_contato_parceiro',
        serchable="1",
        widget=StringWidget(
            label="Email da pessoa de contato",
            description="Informe o email da pessoa de contato.",
            label_msgid='SIGFS_label_email_contato_parceiro',
            description_msgid='SIGFS_help_email_contato_parceiro',
            i18n_domain='SIGFS',
        ),
        validators=('isEmail',)
    ),

    DataGridField(
        name='outras_fontes',
        serchable="1",
        widget=DataGridWidget(
            label="Outras fontes",
            description="Informe as outras fontes de recursos e parcerias quando for o caso.",
            column_names=('Nome', 'Valor', 'Ano',),
            label_msgid='SIGFS_label_outras_fontes',
            description_msgid='SIGFS_help_outras_fontes',
            i18n_domain='SIGFS',
        ),
        columns=('nome', 'valor', 'ano',)
    ),

    ReferenceField(
        name='atividades',
        widget=MultiSelectionWidget(
            addable="1",
            label="Atividade",
            description="Selecione as Atividades que estão relacionadas a este Termo de Referência.",
            label_msgid='SIGFS_label_atividades',
            description_msgid='SIGFS_help_atividades',
            i18n_domain='SIGFS',
        ),
        allowed_types=('Atividade',),
        multiValued=1,
        relationship='termo_atividade'
    ),

),
)

##code-section after-local-schema #fill in your manual code here
##/code-section after-local-schema

TermoReferencia_schema = BaseBTreeFolderSchema.copy() + \
    schema.copy()

##code-section after-schema #fill in your manual code here
##/code-section after-schema

class TermoReferencia(BaseBTreeFolder):
    """
    """
    security = ClassSecurityInfo()
    __implements__ = (getattr(BaseBTreeFolder,'__implements__',()),)

    # This name appears in the 'add' box
    archetype_name = 'Termo de Referência'

    meta_type = 'TermoReferencia'
    portal_type = 'TermoReferencia'
    allowed_content_types = ['ChamadaPublica', 'CartaConvite', 'Encomenda', 'File']
    filter_content_types = 1
    global_allow = 0
    content_icon = 'document_icon.gif'
    immediate_view = 'base_view'
    default_view = 'termo_view'
    suppl_views = ()
    typeDescription = "Termo de Referência é o resultado de uma Atividade pedida para ser executada, gerada pela Reunião. Quando no estado pendente, será enviado um email para que os revisores possam comentar o Termo de Referência, antes de publicá-lo. Para inserir um arquivo referente ao Termo, no link 'Adicionar novo item', escolher 'Arquivo'."
    typeDescMsgId = 'description_edit_termoreferencia'
    allow_discussion = 1


    actions =  (


       {'action': "string:${object_url}/termo_referencia_view",
        'category': "object",
        'id': 'view',
        'name': 'View',
        'permissions': ("View",),
        'condition': 'python:1'
       },


       {'action': 'string:${object_url}/folder_localrole_form',
        'category': "object",
        'id': 'sharing',
        'name': 'Sharing',
        'permissions': ("SIGFS: Add Termo de Referencia",),
        'condition': 'python:1'
       },


       {'action': "string:${object_url}/termo_referencia_edit",
        'category': "object",
        'id': 'edit',
        'name': 'Edit',
        'permissions': ("Modify portal content",),
        'condition': 'python:1'
       },


    )

    _at_rename_after_creation = True

    schema = TermoReferencia_schema

    ##code-section class-header #fill in your manual code here
    ##/code-section class-header

    # Methods

    # Manually created methods

    def getResponsavel_julgamento(self):
        """Retorna o Responsável por Acompanhar o julgamento do Edital."""
        atividade = self.aq_inner.aq_parent
        tipo = atividade.getTipo()
        for i in tipo:
            if tipo == '3':
                convocados = atividade.getLista_convocados()
                convidados = atividade.getLista_convidados()
                outros = atividade.getOutros()
                responsaveis = convocados + convidados + outros
                return responsaveis

    security.declarePrivate('_renameAfterCreation')
    def _renameAfterCreation(self, check_auto_id=False):
        """Renomeia o objeto com id numérico sequencial de 6 casas decimais."""
	parent_ids = self.aq_inner.aq_parent.objectIds()
        try:
          new_id = 'tr'+'%0.4i' % len(parent_ids)
          # Usando o portal_factory tem que comitar a subtransacao
          transaction.savepoint(optimistic=True)
	  self.setId(new_id)
	except:
	  new_id = 'tr'+'%0.4i' % len(parent_ids) + str(random.randint(1,1000))
          # Usando o portal_factory tem que comitar a subtransacao
          transaction.savepoint(optimistic=True)
	  self.setId(new_id)

    def getResponsavel_resolucao(self):
        """Retorna o Responsável por Acompanhar Ação proposta."""
        atividade = self.aq_inner.aq_parent
        tipo = atividade.getTipo()
        for i in tipo:
            if tipo == '4':
                convocados = atividade.getLista_convocados()
                convidados = atividade.getLista_convidados()
                outros = atividade.getOutros()
                responsaveis = convocados + convidados + outros
                return responsaveis

    def getData_publicacao(self):
        """Retorna a data de publicação do objeto."""
        wh =  self.getWorkflowHistory()
        for i in wh:
            if i['action'] == 'publish':
                return i['time']

    def getInstrumentos(self):
        """Retorna a lista de Instrumentos a que o TR vai se transformar."""
        portal_sigfs = getToolByName(self, 'portal_sigfs')
        result = []
        vocabulary = portal_sigfs.getVocab_instrumento()

        for item in vocabulary:
            parts = item.split(';')
            result.append([parts[0], parts[1]])
        return DisplayList(tuple(result))

    def getResponsavel_atividade(self):
        """Retorna os Responsáveis pela Atividade de Criar o TR."""
        atividade = self.aq_inner.aq_parent
        tipo = atividade.getTipo()
        for i in tipo:
            if tipo == '1':
                convocados = atividade.getLista_convocados()
                convidados = atividade.getLista_convidados()
                outros = atividade.getOutros()
                responsaveis = convocados + convidados + outros
                return responsaveis

    def listAtividades(self):
        """Retorna a lista de Atividades que podem estar relacionadas ao Termo."""
        atividade = self.aq_inner.aq_parent
        resolucao = atividade.aq_inner.aq_parent
        lista_atividades = resolucao.objectValues()
        result = []
        for i in lista_atividades:
            result.append(i.Title())
        return result

    def getAgencias(self):
        """Retorna a lista de Agências."""
        portal_sigfs = getToolByName(self, 'portal_sigfs')
        result = []
        vocabulary = portal_sigfs.getVocab_agencia()

        for item in vocabulary:
            parts = item.split(';')
            result.append([parts[0], parts[1]])
        return DisplayList(tuple(result))

    def getSubAcao(self):
        """Retorna a Sub-ação escolhida na Resolução."""
        atividade = self.aq_inner.aq_parent
        resolucao = atividade.aq_inner.aq_parent
        return resolucao.getSub_acao()



registerType(TermoReferencia, PROJECTNAME)
# end of class TermoReferencia

##code-section module-footer #fill in your manual code here
##/code-section module-footer



